import random

from PIL import Image
import svgwrite

import cv2
import numpy as np
import subprocess

def convtoSvg1():
    # 读取PNG图片
    img = Image.open('shipin.png')
    #.convert('RGBA')
    # 创建SVG画布
    dwg = svgwrite.Drawing('output.svg', profile='full', size=(19, 19))
    # 绘制饼状图
    dwg.add(dwg.image('shipin.png', insert=(0, 0), size=(img.width, img.height)))

    # 保存SVG图片
    dwg.save()




# import sys
# import os
# from PIL import Image
# def convertPixel(r, g, b, a=1):
#  color = "#%02X%02X%02X" % (r, g, b)
#  opacity = a
#  return (color, opacity)
# for r in sys.argv[1:]:
#  root, ext = os.path.splitext(r)
#  image = Image.open(r)
#  mode = image.mode
#  pixels = image.load()
#  width, height = image.size
#  print(image.mode)
#  if "RGB" in mode:
#   output = "<svg width="%d" height="%d" viewBox="0 0 %d %d" xmlns="http://www.w3.org/2000/svg" " % (width, height, width, height)
#   for r in range(height):
#    for c in range(width):
#     color, opacity = convertPixel(*pixels[c, r])
#     output += "<rect x="%d" y="%d" width="1" height="1" fill="%s" fill-opacity="%s"/ " % (c, r, color, opacity)
#   output += "</svg "
#   with open(root + ".svg", "w") as f:
#    f.write(output)
def convtoSvg2():
    img = Image.open('shipin.png')
    image = img
    if img.mode == "RGBA":
        # 提取Alpha通道
        alpha = np.array(img.getchannel('A'))
        # 如果需要，将Alpha通道转换为OpenCV的格式（通常是单通道8位图像）
        # 在这种情况下，Alpha通道已经是单通道8位的，所以不需要转换
        # 但如果你需要将其转换为OpenCV的BGR格式（尽管这通常不是必需的），你可以这样做：
        # alpha_bgr = cv2.cvtColor(alpha, cv2.COLOR_GRAY2BGR)
        image = alpha
        # 显示Alpha通道（可选）



    # image = cv2.imread('shipin.png', cv2.IMREAD_UNCHANGED)
    #如果图片是彩色的，可以转换为灰度，然后二值化
    # image = cv2.cvtColor(alpha, cv2.COLOR_BGR2GRAY)
    # 由于我们的假设是img已经是灰度图像，但它是32位的
    # 我们需要将其缩放到0-255范围，并转换为8位
    # img_scaled = (image / np.max(image) * 255).astype(np.uint8)

    # 现在我们可以对缩放后的8位灰度图像进行二值化处理
    _, img_binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow('Binary Image', img_binary)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # _, image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
    print(img_binary)
    # 将图像数据转换为字符串，以便传递给potrace
    image_str = ' '.join(str(item) for row in img_binary for item in row)
    print(image_str)
    i=random.randrange(100)
    file_name = 'shipin_'+str(i)+'.pgm'
    with open(file_name, 'wb') as f:
        # 写入PGM头（P6表示RGB，ASCII编码）
        f.write(b'P5\n')
        # 写入图像的宽度和高度
        f.write(f"{img_binary.shape[1]} {img_binary.shape[0]}\n".encode('ascii'))
        # 写入最大像素值（255）
        f.write(f'255\n'.encode('ascii'))
        # f.write(b'255\n')
        # 写入图像数据（RGB，每个通道一个字节）
        f.write(img_binary.tobytes())


        # file.write("P5\n")
        # file.write(f"{img_binary.shape[1]} {img_binary.shape[0]}\n")
        # file.write("255\n")
        # file.write(image_str)
    print(file_name)
    # 使用potrace将PGM转换为SVG
    subprocess.run(['D:\soft\potrace-1.16.win64\potrace-1.16.win64\potrace.exe', '-s', '-o', 'shipin_1'+str(i)+'.svg', 'output_shipin.pgm'])



def convtoSvg3(input_image_path, output_image_path):
    # 打开图像文件
    img = Image.open(input_image_path)

    # 检查图像模式
    if img.mode == 'RGBA':
        # 将RGBA图像转换为RGB（去掉alpha通道）
        img = img.convert('RGB')
    elif img.mode != 'RGB':
        # 如果不是RGB或RGBA，抛出错误
        raise ValueError("Unsupported image mode: {}".format(img.mode))

    # cv2.imshow('Alpha Channel', img)
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
    # 将图像转换为NumPy数组
    img_array = np.array(img)

    # 将NumPy数组写回图像文件（以PGM格式）
    # 注意：PGM通常用于灰度图像，但这里我们使用RGB模式保存
    # 如果你确实需要灰度图像，可以先将图像转换为灰度
    # img_array = np.array(img.convert('L'))

    # 保存为PGM (使用 maxval 来指定最大像素值，符合PGM格式规范)
    with open(output_image_path, 'wb') as f:
        # 写入PGM头（P6表示RGB，ASCII编码）
        f.write(b'P5\n')
        # 写入图像的宽度和高度
        f.write(f"{img_array.shape} {img_array.shape}\n".encode('ascii'))
        # 写入最大像素值（255）
        f.write(f'255\n'.encode('ascii'))
        #f.write(b'255\n')
        # 写入图像数据（RGB，每个通道一个字节）
        f.write(img_array.tobytes())

    # 示例用法


input_image_path = 'shipin.png'  # 输入32bpp图像路径
output_image_path = 'output_shipin.pgm'  # 输出PGM图像路径
# convtoSvg3(input_image_path, output_image_path)
# subprocess.run(['D:\soft\potrace-1.16.win64\potrace-1.16.win64\potrace.exe', '-s', '-o', 'shipin_xxx.svg', 'output_shipin.pgm'])
#


def pngconvertpgm(png_file, pgm_file):
    with Image.open(png_file) as img:
        # 将图像转换为灰度
        gray_img = img.convert('L')
        # 保存为PGM格式
        gray_img.save(pgm_file, format='PGM')



# pngconvertpgm("shipin.png","shipin_53.pgm")
convtoSvg2()